// servlet側で直接書き込む変数
/*
var calendarList = [ [ "calenderId", "category", "14", 1000 ]["calenderId",
        "category", "18", 6000] ];
var eventList = {
    "2012-12-01" : [ [ "2012-12-29", "$交際費", 3045, "お酒" ] ],
    "2013-01-01" : [ [ "2013-01-04", "$その他", 4651, "スーツ" ],
            [ "2013-01-04", "$その他", 1600, "お年賀" ],
            [ "2013-01-04", "$生活費", 4260, "ユニクロ" ],
            [ "2013-01-04", "$食費", 240, "アイス" ],
            [ "2013-01-31", "$交際費", 4000, "品川宴会" ] ],
    "2013-02-01" : [ [ "2013-02-01", "$交通費", 5000, "チャージ" ],
            [ "2013-02-01", "$食費", 100, "シュークリーム\n" ],
            [ "2013-02-01", "$食費", 1118, "パン" ] ]
};
var googleCalendarSrcs = '';
var thisMonth = '2013-05-01';
*/

// ライブラリのロード
google.load('visualization', '1.0', {
    'packages' : [ 'table', 'corechart' ]
});

// 最初に今月のページを表示する
if (location.hash === '') {
    window.location.hash = '#main' + thisMonth;
}

var monthList = [];
var chartMap = {};
for ( var month in eventList) {
    monthList.push(month);
    chartMap[month] = {
        dataTable : {
            chart : null,
            data : null,
            option : null
        },
        categoryPie : {
            array : null,
            chart : null,
            data : null,
            option : null
        },
        dailyColumn : {
            array : null,
            chart : null,
            data : null,
            option : null
        },
        budgetBar : {
            array : null,
            chart : null,
            data : null,
            option : null
        },
        sumMoney : 0
    };
}

// jqm の初期設定調整
$(document).on("mobileinit", function() {
    // swipeイベントの調整
    $.event.special.swipe.horizontalDistanceThreshold = 120;
    $.event.special.swipe.scrollSupressionThreshold = 10; // デフォルト
    $.event.special.swipe.durationThreshold = 1000; // デフォルト
    $.event.special.swipe.verticalDistanceThreshold = 75; // デフォルト
});

// mainページのイベント追加
$.each(monthList, function(i, month) {

    // 初期処理
    $('#main' + month).live(
            'pageinit',
            function() {
                // chart生成
                createArrayData(month);
                createCategoryPie(month);
                createDailyColumn(month);
                createDataTable(month);

                // swipeの処理
                var l = monthList.length;
                if (i > 0) {
                    $('#main' + month + '_content').live(
                            'swiperight',
                            function() {
                                $.mobile.changePage('#main' + monthList[i - 1],
                                        {
                                            transition : "slide",
                                            reverse : true
                                        });
                            });
                }
                if (i < l - 1) {
                    $('#main' + month + '_content').live(
                            'swipeleft',
                            function() {
                                $.mobile.changePage('#main' + monthList[i + 1],
                                        {
                                            transition : "slide"
                                        });
                            });
                }

                // resize時の処理
                $(window).resize(
                        function() {
                            // CategoryPie表示
                            var categoryPie = chartMap[month].categoryPie;
                            if (categoryPie && categoryPie.chart)
                                categoryPie.chart.draw(categoryPie.data,
                                        categoryPie.option);
                            // DailyColumn表示
                            var dailyColumn = chartMap[month].dailyColumn;
                            if (dailyColumn && dailyColumn.chart)
                                dailyColumn.chart.draw(dailyColumn.data,
                                        dailyColumn.option);
                            // DataTable表示
                            var dataTable = chartMap[month].dataTable;
                            if (dataTable && dataTable.chart)
                                dataTable.chart.draw(dataTable.data,
                                        dataTable.option);
                            // 合計金額の表示
                            drawSumMondy(month);
                        });
            });

    // ページ表示時の処理
    $('#main' + month).live(
            'pageshow',
            function() {
                // CategoryPie表示
                var categoryPie = chartMap[month].categoryPie;
                if (categoryPie && categoryPie.chart)
                    categoryPie.chart
                            .draw(categoryPie.data, categoryPie.option);
                // DailyColumn表示
                var dailyColumn = chartMap[month].dailyColumn;
                if (dailyColumn && dailyColumn.chart)
                    dailyColumn.chart
                            .draw(dailyColumn.data, dailyColumn.option);
                // DataTable表示
                var dataTable = chartMap[month].dataTable;
                if (dataTable && dataTable.chart)
                    dataTable.chart.draw(dataTable.data, dataTable.option);
                // 合計金額の表示
                drawSumMondy(month);
            });
});

// 初期処理
$('#all').live('pageinit', function() {
    console.log('all - pageinit');

    // 初期処理
    var array = [];
    for(var key in eventList){
        array = array.concat(eventList[key]);
    }
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'date');
    data.addColumn('string', 'category');
    data.addColumn('number', 'money');
    data.addColumn('string', 'description');
    data.addRows(array);
    new google.visualization.NumberFormat({
        pattern : '#,###'
    }).format(data, 2);

    var chart = new google.visualization.Table(document
            .getElementById('all_table'));
    chart.draw(data, {
        showRowNumber : false
    });
    
    // resize時の処理
    $(window).resize(function() {
        console.log('all - resize');
    });
});
$('#all').live('pageshow', function() {
    console.log('all - pageshow');
    // 描画処理
});

$('#cal').live('pageshow', function() {
    var height = $(document).height() - 45 - 40;
    $('#cal_iframe').attr({
        'src' : googleCalendarSrcs + 'height=' + height,
        'height' : height
    });
});

/**
 * 
 */
var createArrayData = function(month) {
    var cArray = [ [ 'category', 'money' ] ];
    var dArray = [ [ 'date', 'money' ] ];
    var sumMoney = 0;

    for ( var i = 0, l = eventList[month].length; i < l; i++) {
        var date = eventList[month][i][0].slice(-2);
        var category = eventList[month][i][1];
        var money = eventList[month][i][2];

        // categoryPie用の配列構築
        var j = 1;
        var isContain = false;
        for ( var cArrayLength = cArray.length; j < cArrayLength; j++) {
            if (cArray[j][0] === category) {
                isContain = true;
                break;
            }
        }
        if (isContain) {
            cArray[j][1] += money;
        } else {
            cArray.push([ category, money ]);
        }

        // dailyColumn用の配列構築
        var dArraylastIndex = dArray.length - 1;
        if (dArray[dArraylastIndex][0] === date) {
            dArray[dArraylastIndex][1] += money;
        } else {
            dArray.push([ date, money ]);
        }

        // 合計金額の算出
        sumMoney += money;
    }

    chartMap[month].categoryPie.array = cArray;
    chartMap[month].dailyColumn.array = dArray;
    chartMap[month].sumMoney = sumMoney;
};

/**
 * 
 */
var createCategoryPie = function(month) {
    var categoryPie = chartMap[month].categoryPie;

    // データ生成
    categoryPie.data = google.visualization
            .arrayToDataTable(chartMap[month].categoryPie.array);
    categoryPie.option = {};

    // categoryPie生成
    categoryPie.chart = new google.visualization.PieChart(document
            .getElementById('main' + month + '_category_pie'));
};

/**
 * @param month 月の情報
 */
var createDailyColumn = function(month) {
    var dailyColumn = chartMap[month].dailyColumn;

    // データ生成
    dailyColumn.data = google.visualization
            .arrayToDataTable(chartMap[month].dailyColumn.array);
    dailyColumn.option = {
        legend : {
            position : 'none'
        }
    };

    // _daily_column生成
    dailyColumn.chart = new google.visualization.ColumnChart(document
            .getElementById('main' + month + '_daily_column'));
};

/**
 * DataTableの生成処理
 * @param month 月の情報
 */
var createDataTable = function(month) {
    var dataTable = chartMap[month].dataTable;

    // データ生成
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'date');
    data.addColumn('string', 'category');
    data.addColumn('number', 'money');
    data.addColumn('string', 'description');
    data.addRows(eventList[month]);
    new google.visualization.NumberFormat({
        pattern : '#,###'
    }).format(data, 2);
    dataTable.data = data;

    dataTable.option = {
        showRowNumber : false
    };

    // Table生成
    dataTable.chart = new google.visualization.Table(document
            .getElementById('main' + month + '_table'));
};

/**
 * 合計金額を表示する
 */
var drawSumMondy = function(month) {
    var d = document;
    var contents = '<p>sum of money: ' + chartMap[month].sumMoney + '</p>';
    d.getElementById('main' + month + '_sum_money').innerHTML = contents;
};

/**
 * @class
 * @param {string} type グラフタイプ
 * @param {string} month 月
 */
var Graph = function(type, month) {
    /**
     * グラフタイプ
     * @type string
     */
    this.type = type;

    /**
     * 月
     * @type string
     */
    this.month = month;
};
Graph.prototype = {
    /**
     * グラフを描画する
     */
    draw : function() {
    }
};
